Елена Булыгина предлагает Вам запомнить сайт «Ленусик»
Вы хотите запомнить сайт «Ленусик»?
Да Нет
×
Прогноз погоды

Основная статья: Обучение java

Быстрый старт с Java: пишем «крестики-нолики»

Перед прочтением данной статьи рекомендую ознакомиться с предыдущей, «Быстрый старт с Java: начало», поскольку ожидается, что читатель владеет материалом, изложенным в ней — знает о переменных, условиях, циклах и импорте классов. Сегодня мы углублим знания о Java, создавая игру «Крестики-нолики», которая работает в командной строке (консоли). В процессе будет рассмотрена работа с массивами, а также некоторые аспекты объектно-ориентированного программирования (нестатические методы, нестатические поля, конструктор).

Массивы

При написании игры используется массив, поэтому давайте для начала рассмотрим, что это. Массивы хранят набор однотипных переменных. Если переменная похожа на коробочку, с написанным на боку типом, именем и со значением внутри, то массив похож на блок таких коробочек. И тип, и имя у блока одно, а доступ к той или иной коробочке (значению) происходит по номеру (индексу).

В Java массивы являются объектами, их создают с помощью директивы new. При создании указываем количество элементов массива или инициализируем его набором значений. Приведенный код иллюстрирует оба варианта:

class Arrays {
    public static void main(String[] args) {
        int[] arr = new int[5];
        int[] arrInit = {1, 2, 3, 4, 5};
        for (int i = 0; i < arr.length; i++) {
            arr[i] = i * 2 + arrInit[i];
        }
        for (int a : arr) {
            System.out.println(a);
        }
    }
}

С элементами массива можно работать как с обычными переменными, присваивая им результат выражения и читая хранимые значения. При этом в квадратных скобках указывается индекс элемента массива. Индексация в Java идёт с 0 (с нуля). Первый цикл инициализирует элементы массива arr при помощи значений из массива arrInit. Каждый массив имеет поле length, содержащее количество его элементов. Второй цикл выводит элементы массива в консоль, используя второй вариант for  без счётчика цикла.

Методы

Кроме main() класс может содержать и другие методы. Рассмотрим в качестве примера класс с методом add(), который вычисляет и возвращает сумму двух значений, переданных как параметры. Обратите внимание на тип int, который стоит перед именем метода — это тип возвращаемого значения. Две переменные в скобках — параметры. Совокупность имени и параметров называют сигнатурой метода. Вызов метода происходит по имени, в скобках указывают передаваемые значения. В методе они попадают в параметры-переменные. Команда return возвращает результат сложения этих двух переменных и обеспечивает выход из метода.

class MethodStatic {
    public static void main(String[] args) {
        int c = add(5, 6);
        System.out.println("5 + 6 = " + c);
    }
 
    static int add(int a, int b) {
        return a + b;
    }
}

Слово static означает, что метод статический. Если мы обращается к какому-либо методу из статического метода, то вызываемый тоже должен быть статическим. Вот почему add() статический — он вызывается из статического main(). Использование статических методов — скорее исключение, чем правило, поэтому давайте посмотрим как сделать add() нестатическим.

Решение одно — создать объект на основании класса. И затем вызывать метод через точку после имени объекта. В этом случае метод может быть нестатическим. Представленный ниже код это иллюстрирует.

class MethodNotStatic {
    public static void main(String[] args) {
        MethodNotStatic method = new MethodNotStatic();
        int c = method.add(5, 6);
        System.out.println("5 + 6 = " + c);
    }
 
    int add(int a, int b) {
        return a + b;
    }
}

Поля класса

Переменные существуют в рамках лишь того метода, где они объявлены. А если нужна переменная, доступная во всех методах класса, то пришло время использовать поля. Поля объявляются подобно переменным, с указанием типа и имени. Но располагаются они не в методах, а прямо в теле класса. Подобно методам, они могут быть статическими и нестатическими. Нестатические поля, как и методы, доступны только после создания объекта.

class FieldExample {
    int a;
 
    public static void main(String[] args) {
        FieldExample field = new FieldExample();
        field.a = 12;
        System.out.println("a = " + field.a);
        System.out.println(field.getA());
        field.printA();
    }
 
    int getA() {
        return a;
    }
 
    void printA() {
        System.out.println(a);
    }
}

Приведённый выше код иллюстрирует работу с нестатическим полем int a. Описание полей принято размещать первыми в коде класса, затем идут описания методов. Возможность обращаться к полю (запись, чтение) мы получаем только после создания объекта. Также видно, что это поле доступно во всех нестатических методах объекта, а в статическом main() — через точку после имени объекта.

Крестики-нолики. Шаблон класса

Приступим к написанию кода игры. Начнём с шаблона класса и определения нужных полей. Именно это содержит приведённый ниже код. Первые две строки — импорт классов. Первыми в теле класса идут описания полей, затем методов. Метод main() используется для создания объекта (так как поля и методы нестатические) и вызова метода game() с игровой логикой.

import java.util.Random;
import java.util.Scanner;
 
class TicTacToe {
    final char SIGN_X = 'x';
    final char SIGN_O = 'o';
    final char SIGN_EMPTY = '.';
    char[][] table;
    Random random;
    Scanner scanner;
 
    public static void main(String[] args) {
        new TicTacToe().game();
    }
 
    TicTacToe() {
        // конструктор: инициализация полей
    }
 
    void game() {
        // игровая логика
    }
 
    // дополнительные методы
}

В качестве полей используем три символьные константы: SIGN_X, SIGN_O и SIGN_EMPTY. Их значения нельзя изменять, об этом говорит модификатор final. Двумерный символьный массив table будет нашим игровым полем. Потребуется также объект random для генерации ходов компьютера и scanner для ввода данных от пользователя.

Имена методов принято писать с маленькой буквы. Однако в коде мы видим метод TicTacToe() — есть ли тут нарушение? Нет, поскольку этот метод особенный и в объектно-ориентированном программировании называется конструктор. Конструктор вызывается сразу после того, как объект создан. Его имя, как видим, должно совпадать с именем класса. Мы используем конструктор для инициализации полей.

TicTacToe() {
    random = new Random();
    scanner = new Scanner(System.in);
    table = new char[3][3];
}

Игровая логика

Игровая логика располагается в методе game() и базируется на бесконечном цикле while. Ниже в фрагменте кода последовательность действий описана через комментарии:

// инициализация таблицы
while (true) {
    // ход человека
    // проверка: если победа человека или ничья:
    //    сообщить и выйти из цикла
    // ход компьютера
    // проверка: если победа компьютера или ничья:
    //    сообщить и выйти из цикла
}

При написании рабочего кода, каждое действие — например, «ход человека», «ход компьютера», «проверка» — мы заменим на вызов соответствующего метода. При возникновении выигрышной или ничейной ситуации (все клетки таблицы заполнены), выходим из цикла с помощью break, завершая игру.

void game() {
    initTable();
    while (true) {
        turnHuman();
        if (checkWin(SIGN_X)) {
            System.out.println("YOU WIN!");
            break;
        }
        if (isTableFull()) {
            System.out.println("Sorry, DRAW!");
            break;
        }
        turnAI();
        printTable();
        if (checkWin(SIGN_O)) {
            System.out.println("AI WIN!");
            break;
        }
        if (isTableFull()) {
            System.out.println("Sorry, DRAW!");
            break;
        }
    }
    System.out.println("GAME OVER.");
    printTable();
}

Реализация вспомогательных методов

Пришло время написать код методов, вызываемых в game(). Самый первый, initTable(), обеспечивает начальную инициализацию игровой таблицы, заполняя её ячейки «пустыми» символами. Внешний цикл, со счетчиком int row, выбирает строки, а внутренний, со счётчиком int col, перебирает ячейки в каждой строке.

 
void initTable() {
    for (int row = 0; row < 3; row++)
        for (int col = 0; col < 3; col++)
            table[row][col] = SIGN_EMPTY;
}

Также потребуется метод, отображающий текущее состояние игровой таблицы printTable().

void printTable() {
    for (int row = 0; row < 3; row++) {
        for (int col = 0; col < 3; col++)
            System.out.print(table[row][col] + " ");
        System.out.println();
    }
}

В методе turnHuman(), который позволяет пользователю сделать ход, мы используем метод nextInt() объекта scanner, чтобы прочитать два целых числа (координаты ячейки) с консоли. Обратите внимание как используется цикл do-while: запрос координат повторяется в случае, если пользователь укажет координаты невалидной ячейки (ячейка таблицы занята или не существует). Если с ячейкой всё в порядке, туда заносится символ SIGN_X — «крестик».

void turnHuman() {
    int x, y;
    do {
        System.out.println("Enter X and Y (1..3):");
        x = scanner.nextInt() - 1;
        y = scanner.nextInt() - 1;
    } while (!isCellValid(x, y));
    table[y][x] = SIGN_X;
}

Валидность ячейки определяет метод isCellValid(). Он возвращает логическое значение: true — если ячейка свободна и существует, false — если ячейка занята или указаны ошибочные координаты.

boolean isCellValid(int x, int y) {
    if (x < 0 || y < 0 || x >= 3|| y >= 3)
        return false;
    return table[y][x] == SIGN_EMPTY;
}

Метод turnAI() похож на метод turnHuman() использованием цикла do-while. Только координат ячейки не считываются с консоли, а генерируются случайно, при помощи метода nextInt(3) объекта random. Число 3, передающееся как параметр, является ограничителем. Таким образом, генерируются случайные целые числа от 0 до 2 (в рамках индексов массива игровой таблицы). И метод isCellValid() снова позволяет нам выбрать только свободные ячейки для занесения в них знака SIGN_O — «нолика».

void turnAI() {
    int x, y;
    do {
        x = random.nextInt(3);
        y = random.nextInt(3);
    } while (!isCellValid(x, y));
    table[y][x] = SIGN_O;
}

Осталось дописать два последних метода — проверка победы и проверка на ничью. Метод checkWin() проверяет игровую таблицу на «победную тройку» — три одинаковых знака подряд, по вертикали или горизонтали (в цикле), а также по двум диагоналям. Проверяемый знак указан как параметр char dot, за счёт чего метод универсален - можно проверять победу и по «крестикам» и по «ноликам». В случае победы возвращается булевское значение true, в противном случае — false.

boolean checkWin(char dot) {
    for (int i = 0; i < 3; i++)
        if ((table[i][0] == dot && table[i][1] == dot &&
                         table[i][2] == dot) ||
                (table[0][i] == dot && table[1][i] == dot &&
                                  table[2][i] == dot))
            return true;
        if ((table[0][0] == dot && table[1][1] == dot &&
                  table[2][2] == dot) ||
                    (table[2][0] == dot && table[1][1] == dot &&
                      table[0][2] == dot))
            return true;
    return false;
}

Метод isTableFull() во вложенном двойном цикле проходит по всем ячейкам игровой таблицы и, если они все заняты, возвращает true. Если хотя бы одна ячейка ещё свободна, возвращается false.

boolean isTableFull() {
    for (int row = 0; row < 3; row++)
        for (int col = 0; col < 3; col++)
            if (table[row][col] == SIGN_EMPTY)
                return false;
    return true;
}

Теперь осталось собрать все эти методы внутри TicTacToe. Последовательность их расположения в теле класса не важна. А после этого можно попробовать сыграть с компьютером в крестики-нолики.

Заключение

На всякий случай прилагаю мой telegram — @biblelamp. Если вас заинтересовала тема, рекомендую почитать «Java-программирование для начинающих» Майка МакГрата и «Изучаем Java» Кэти Сьерра и Берт Бейтс. Также напоминаю ссылку на мою предыдущую статью, где мы начали знакомство с Java.

Если язык Java вас заинтересовал — приглашаем на факультет Java-разработки. Если ещё не совсем уверены — посмотрите истории успеха наших Java-выпускников:

Пройти обучение

28 ноя 19, 11:13
0 0
Статистика 1
Показы: 1 Охват: 0 Прочтений: 0

Быстрый старт с Java: от знакомства до вашей первой игры 

Эта статья рассчитана на новичков в программировании. Её цель — объяснить азы языка Java (классы, методы, компиляция, байт-код, JVM, переменные, условия, циклы, импорт). Этот материал поможет:

  • научиться писать код, компилировать и запускать байт-код;
  • познакомиться с переменными;
  • узнать об условных операторах и циклах;
  • освоить использование классов из стандартных пакетов;
  • написать простую консольную игру «Угадай число».

Java Development Kit (JDK)

Для работы с Java необходимо скачать, установить и настроить Java Development Kit (JDK) — пакет программ и утилит для разработчика. Он бесплатно предоставляется компанией Oracle.
В строку поиска Google вводим запрос “jdk 8 download” и в первой же строке поисковой выдачи видим ссылку на страницу загрузки на oracle.com. Листаем вниз, щёлкаем Accept License Agreement — соглашаемся с лицензией. Выбираем пакет в колонке Download, который соответствует вашей операционной системе и её разрядности (32 или 64 бита). Для скачивания нужно будет зарегистрироваться на сайте. Скачиваем и устанавливаем JDK. При выборе пакетов и папки JDK рекомендую отказаться от Public JRE и сократить имя папки до jdk1.8.

Счастливым обладателям Windows потребуется также настройка системных переменных. Как их найти: Панель управления → Система → Дополнительные параметры системы → Вкладка «Дополнительно» → кнопка «Переменные среды», второе окошко сверху. В нем надо создать переменную JAVA_HOME и изменить (дополнить) Path (для этого используются кнопки «Создать» и «Изменить». Значение для переменной JAVA_HOME содержит путь к папке JDK. Переменную Path дополняем значением %JAVA_HOME%\bin. Обратите внимание, что список путей разделяется точкой с запятой (;). Инструкция есть также на сайте Oracle.

JDK содержит много утилит, но нам потребуется только компилятор (javac) и виртуальная машина Java — JVM (java).

Проверить правильность установки и настройки можно в командной строке (на Windows: Win + R → cmd) или в терминале (Linux, Mac), набрав следующие команды:

javac -version
java -version

В качестве альтернативы можно использовать онлайн-JDK вместе с редактором, например на сайте Repl.it.

Написание кода

Писать исходный код можно в любом текстовом редакторе. А компиляцию и запуск проводить в командной строке (терминале). Но удобнее будет работать в редакторе с подсветкой синтаксиса и плагином, автоматизирующим компиляцию и запуск.

Для Windows хорошим выбором будет Notepad++ с плагином NppExec. Подробно о его настройке можно прочитать в статье Виктора Темпалова  «Компилируем и запускаем Java-файлы из Notepad++». Для Linux и Мас есть другие текстовые редакторы, например Atom или Sublime Text.

Hello, world!

При изучении нового языка писать программу, выводящую «Hello, world!», — это традиция. Она возникла в 1978 году, с выходом в свет книги «Язык программирования С» Брайана Кернигана и Денниса Ричи.

class HelloWorld {
    public static void main(String[] args) {
        System.out.println("Hello, world!");
    }
}

Код начинается с ключевого слова class. Java-программы состоят из классов — это «кирпичики» приложения. В реальных приложениях их могут быть десятки, сотни и тысячи. Затем пишется имя класса — HelloWorld. Имена классов принято писать в стиле CamelCase (все слова слитно, каждое с заглавной буквы). Классам, как и другим сущностям — методам, полям и переменным — рекомендуется давать мнемонические, «говорящие» имена.

После имени в фигурных скобках записывается тело класса. Оно может содержать поля, методы и другие классы. Поля хранят данные. Они подобны переменным, однако в Java это несколько иная сущность. Методы содержат набор команд или код. Имена методов (как и полей, переменных) принято писать в стиле camelCase, со строчной буквы.

В нашем классе только один метод — main(). Он особенный, его часто называют стартовым. Когда виртуальная машина Java получает класс для исполнения, она ищет в нём метод main. Если находит — выполняет код, который содержит метод. Если нет — выдаёт сообщение об ошибке. Важно, чтобы метод main() имел строго определённую сигнатуру: был публичным (public), статическим (static), не возвращающим никакого значения (void), с параметром в виде массива строк (String[] args). В противном случае виртуальная машина его просто не найдёт.

Наш метод main() содержит лишь одну строку, которая выводит в консоль текст "Hello, world!".

Перед компиляцией сохраняем написанный код в файл. Имя файла должно соответствовать имени класса с точностью до регистра символов (Java — регистрозависимый язык). Затем открываем командную строку (или терминал) и вызываем сначала компилятор (javac), а потом виртуальную машину JVM (java).

C:\Users\User>javac HelloWorld.java
C:\Users\User>java HelloWorld
Hello, world!

После компиляции возникнет бинарный файл HelloWorld.class, содержащий байт-код. Имя этого файла (без расширения) передаётся как параметр при вызове виртуальной машины. В результате видим строку «Hello, world!» — это результат выполнения программы.

Переменные

Переменные хранят данные (числа, строки, логические значения и другие). Они похожи на коробочки: надписи на них — это имя и тип переменной, а внутри находится значение. При этом возможны две операции:

  • запись значения в переменную (или присвоение значения);
  • чтение значения из переменной. 

В Java перед использованием переменную нужно обязательно объявить, указав тип и имя, поскольку Java — язык со строгой и статической типизацией. Попытка использовать переменную без объявления приведёт к ошибке компиляции. По типу переменные могут быть простыми (числа, символы, логические значения) или ссылочными (массивы, строки, любые другие объекты). В Java есть восемь простых типов (byte, int, short, long, float, double, boolean, char) и бесконечное количество ссылочных.

В примере ниже мы видим объявление двух переменных целого типа (int). Причём переменная second инициируется при объявлении. Затем переменной first присваивается результат выражения, в котором присутствует переменная second. В результате выполнения программы в консоль будут выведены значения обеих переменных: 35 и 10.

class Variables {
    public static void main(String[] args) {
        int first;
        int second = 10;
        first = second * 3 + 5;
        System.out.println(first);
        System.out.println(second);
    }
}

Имя переменной может содержать буквы и цифры, знак подчёркивания и $. Имя не должно начинаться с цифры. В профессиональной разработке в именах переменных используют только буквы. Имя должно явно указывать на назначение переменной. Например: countString — счётчик строк, errorSign — признак ошибки. Рекомендуется избегать однобуквенных имён — за исключением временных переменных (существующих в рамках цикла или небольшого кодового блока).

Проверка условий

Любой язык программирования высокого уровня позволяет изменять порядок выполнения программы в зависимости от заданного условия. В Java для этого используется конструкция if. После этого ключевого слова в скобках записывается логическое выражение, затем в фигурных скобках — группа команд. Если результат логического выражения — true (истина), то эта группа команд выполняется, если false (ложь) — нет.

class ComparisonShort {
    public static void main(String[] args) {
        int i = 10;
        if (i == 10) {
            System.out.println("i = 10");
        }
    }
}

Результат этого примера — строка “i = 10” в консоли, так как результат логического выражения (проверка на равенство) будет true.

В качестве знаков сравнения допустимы: <, <=, >, >=, ==, !=. Добавив ключевое слово else, получаем полную форму оператора сравнения.

class ComparisonFull {
    public static void main(String[] args) {
        int i = 10 + 2;
        if (i == 10) {
            System.out.println("i = 10");
        } else {
            System.out.println("i != 10");
        }
    }
}

Выполнив эту программу, мы увидим в консоли сообщение “i != 10”, так как результат сравнения значения переменной i и цифры 10 будет false. Поэтому выполнится набор команд в фигурных скобках после слова else.

Циклы

Циклы предназначены для повторения группы команд. Java позволяет использовать два вида циклов:

  • с определённым количеством итераций: for;
  • без определенного количества итераций: while и do-while.
class CycleFor {
    public static void main(String[] args) {
        for (int i = 0; i < 5; i++) {
            System.out.println(i);
        }
    }
}

Запустив этот пример, мы увидим в консоли колонку чисел от 0 до 4. Это результат работы классического цикла for со счётчиком. В круглых скобках три параметра цикла, разделённые точкой с запятой: объявление и инициализация счётчика, проверка условия продолжения цикла, действие после каждой итерации. В фигурных скобках — тело цикла. В нашем случае это команда, выводящая значение счётчика i в консоль.

Когда будем писать игру, используем циклы while и do-while — там и увидим их работу на практике. Пока достаточно сказать, что их синтаксис проще for, а тело цикла повторяется до тех пор, пока логическое выражение в круглых скобках после while возвращает true.

Пример ниже иллюстрирует вторую форму цикла for — без счётчика. Такой вариант удобен при переборе элементов массива или списка.

class CycleForeach {
    public static void main(String[] args) {
        int[] arr = {5, 4, 3, 2, 1};
        for (int a : arr) {
            System.out.println(a);
        }
    }
}

Импорт и использование классов

Один из важных принципов программирования — DRY: Don’t Repeat Youself (не повторяйся). Разработчик должен уметь использовать то, уже создано, отлажено и работает.

Java поставляется с набором packages (пакетов). Они содержат скомпилированные классы, сгруппированные по тематике. На неё указывает имя пакета: java.io, java.util, java.net и так далее.

В игре нам потребуется случайное число от 0 до 9. Писать генератор случайных чисел незачем, так как в пакете java.util есть готовый класс Random. Чтобы использовать класс из пакета, его нужно импортировать. Строки с директивами импорта располагаются в самом начале файла класса.

import java.util.Random;

Создадим объект на основании класса, чтобы можно было вызвать нужный метод. Слева от знака присваивания (=) объявляем ссылочную переменную (объект) random типа Random. Справа создаём объект с помощью директивы new.

Random random = new Random();

Вызываем метод через точку после имени объекта: random.nextInt(10). Цифра 10 ограничивает диапазон генерируемых чисел (от 0 до 9). В результате получим строку из 30 случайных чисел. Запустите программу несколько раз и обратите внимание, что последовательность чисел не повторяется.

import java.util.Random;
 
class RandomInt {
    public static void main(String[] args) {
        Random random = new Random();
        for (int i = 0; i < 30; i++) {
            System.out.print(random.nextInt(10) + " ");
        }
    }
}

Игра «Угадай число»

Мы узнали достаточно, чтобы написать игру «Угадай число». В ней компьютер «загадывает» целое число от 0 до 9, а человек должен угадать его — есть три попытки.

Создадим класс GuessTheNumber с методом main(), импортируем нужные нам классы и добавим соответствующие объекты. Класс Scanner обеспечит чтение чисел с консоли (System.in — консоль).

import java.util.Scanner;
import java.util.Random;
 
class GuessTheNumber {
    public static void main(String[] args) {
        Random random = new Random();
        Scanner sc = new Scanner(System.in);
    }
}

Объявим и инициируем три переменные: счётчик попыток count, для чтения числа с консоли — guess, для хранения загаданного числа — number.

int count = 0;
int guess = -1; 
int number = random.nextInt(10);

Опишем основной игровой цикл, используя while. В цикле запрашиваем число с консоли, сравниваем с загаданным. В случае несовпадения выводим подсказку и увеличиваем счётчик попыток на 1.

while (count < 3 && guess != number) {
    System.out.print("Guess the number (0..9): ");
    guess = sc.nextInt();
    if (number != guess) {
        System.out.println("Your number is " +
            ((guess > number)? "greater" : "less"));
        count++;
    }
}

Тело цикла while повторяется, пока логическое значение в скобках возвращает true. Таким образом наш цикл будет повторяться, пока значение счётчика попыток меньше 3 и число не отгадано. Обратите внимание на конструкцию, которая позволяет выбрать одно из двух значений согласно условию в скобках. Это тернарный оператор. Если условие в скобках true, то возвращается значение слева от двоеточия, если false — справа.

(guess > number)? "greater" : "less"

Остаётся добавить строку с выводом результата игры (победа или проигрыш) после цикла — тут снова используется тернарный оператор. Текст работающей программы выглядит так:

import java.util.Scanner;
import java.util.Random;
 
class GuessTheNumber {
    public static void main(String[] args) {
        Random random = new Random();
        Scanner sc = new Scanner(System.in);
        int count = 0;
        int guess = -1;
        int number = random.nextInt(10);
        while (count < 3 && guess != number) {
            System.out.print("Guess the number (0..9): ");
            guess = sc.nextInt();
            if (number != guess) {
                System.out.println("Your number is " +
                    ((guess > number)? "greater" : "less"));
                count++;
            }
        }
        System.out.println("You " +
            ((guess == number)? "WIN!" : "Lose: " + number));
    }
}

Сохраняем программу в файл GuessTheNumber.java, компилируем (javac), вызываем JVM (java) — и пробуем выиграть у компьютера.

Добавим заключительный штрих: используя цикл do-while, позволим пользователю повторять сеанс игры без перезапуска программы. В приведённом ниже коде комментарий нужно заменить на соответствующий фрагмент из предыдущей программы. Попробуйте сделать это самостоятельно.

import java.util.Random;
import java.util.Scanner;
 
class GuessTheNumber {
    public static void main(String[] args) {
        Random random = new Random();
        Scanner sc = new Scanner(System.in);
        do {
            //
            // Вставьте фрагмент, который должен повторяться
            //
            System.out.println("Repeat game? Yes - 1, No - 0");
        } while (sc.nextInt() == 1);
    }
}

Обратите внимание, что тело цикла do-while повторяется на тех же условиях, что и тело цикла while: логическое выражение в скобках должно быть true.

Заключение

На всякий случай прилагаю мой telegram — @biblelamp. Если вас заинтересовала тема, рекомендую почитать «Java-программирование для начинающих» Майка МакГрата и «Изучаем Java» Кэти Сьерра и Берт Бейтс. В следующих статьях мы продолжим начальное изучение Java на примере создания других игр. Следите за блогом!

Если язык Java вас заинтересовал — приглашаем на факультет Java-разработки. Если ещё не совсем уверены — посмотрите истории успеха наших Java-выпускников:

Пройти обучение

15 ноя 19, 16:33
0 0
Статистика 1
Показы: 1 Охват: 0 Прочтений: 0

Тренды среди языков программирования в 2019 году

Все, кто хочет связать свою жизнь с программированием, задумываются о том, на какой язык замахнуться. Здесь важно не только понимать, как обстоят дела сегодня, но и следить за трендами — ведь к тому времени, как обучение закончится, что-нибудь в картине мира наверняка поменяется. В этом посте мы вместе с экспертами Geekbrains посмотрим, что говорят опросы, и оценим, какие языки завоевывают мир, а какие уже уходят в прошлое.

Популярные языки программирования

Начнём с традиционно популярных языков, Как известно, любой распространенный язык имеет в запасе минимум 10 лет, чтобы специалисты в нём оставались востребованными на рынке.
Согласно рейтингам авторитетного портала PYPL, основывающихся на популярности поисковых запросах Google в разных странах, самым востребованным языком сегодня является Python. Он обошёл Java ещё летом прошлого года, и количество запросов с тех пор увеличилось на 4,5%.

По версии портала TIOBE, учитывающего не только Google, а все поисковые системы, первое место давно и уверенно удерживает как раз Java. При этом статистика этого портала подтверждает, что языки живут в противофазе: Java за год потерял 0,9%, в то время как Python набрал 1,93 пункта.

Известная софтверная компания JetBrains на своём официальном сайте опросила 7 тысяч разработчиков. Результаты следующие: JavaScript первый, на втором месте Java (оставим HTML/CSS и SQL за скобками), на третьем Python. При этом у Python вновь лучший прирост аудитории за год — 9 %.

Вот что о феномене Python говорит преподаватель факультета искусственного интеллекта GeekUniversity Сергей Ширкин:

«Python очень прост в освоении – можно быть новичком в программировании и уже писать на нём рабочие программы. В своё время это подошло Data Science, потому что большую часть контингента в этой сфере составляли математики и физики, но не профессиональные программисты. В итоге самые популярные библиотеки для работы с большими данными – на Python.

Единственное, что ограничивает язык – низкая скорость работы программ, особенно если мы сравниваем с C/C++. При этом в Python есть такие библиотеки, как numpy, которая, благодаря тому, что часть кода написана на C и Fortran, почти не уступают в производительности.

Сейчас Python проникает в область квантовых вычислений и квантового машинного обучения. Сейчас уже для этого есть библиотеки Qiskit, Cirq, PennyLane, дальше – больше. Здесь уже скорость исполнения программ на Python не важна, ведь все операции проходят на квантовом компьютере, быстродействие которого на порядки выше».

Языки программирования «второго эшелона»

При взгляде на рейтинг PYPL также бросается в глаза взлёт Kotlin: четыре позиции за год и итоговое 12 место.  Пользователи на сайте JetBrains отдали языку 9 место. Причин взлёта две.

Первая — это обновление языка в конце лета. Тогда были устранены многие проблемы и расширена функциональность, с сопутствующим введением всех новых фичей в IntelliJ IDEA – популярнейшую среду программирования. Вторая причина — в прошлом году язык Kotlin получил статус предпочтительного для разработки Android-приложений.

Вот что думает об этом декан факультета Android-разработки GeekUniversity Александр Аникин:

«Если в прошлом году Kotlin стал предпочтительным для Android, то в этом, по сути, главным. Теперь весь новый код, библиотеки, обновления и примеры будут писаться разработчиками платформы на Kotlin. Для этого есть 3 основные причины:

  • Юридический уход от Java. Не секрет, что Oracle в последние годы всё больше ограничивает бесплатное использование Java, что больше всего, пожалуй, затрагивает Android.
  • Полная взаимозаменяемость языков. Можно легко перейти с одного языка на другой не изменив ни строчки кода.
  • Kotlin = Java 2.0. Это современный язык, имеющий те же возможности, что и родитель, но улучшенный с учётом текущих тенденций.

Вообще Kotlin сегодня видится языком без сдерживающих факторов. На нём можно писать не только мобильные приложения, но и серверную часть, приложения для десктопов и многое другое. Он быстро развивается, его разработчики учитывают критику, следят за тенденциями. Поэтому ближайшие годы популярность Kotlin будет неизменно расти».

Другой заметный язык – Rust, который также выделяется в рейтинге PYPL. Год назад мы узнали о том, что это один из самых любимых языков у посетителей портала Stack Overflow. Rust очень медленными шагами идёт к замещению C/C++ в клиентских и серверных веб-приложениях. Этим он обязан популярному формату инструкций для виртуальной машины WebAssembly, поддерживающему все три вышеназванных языка.

Кроме того, он поддерживает и Go — язык к которому также стоит присмотреться. Согласно JetBrains, у Go ожидается самый большой прирост популярности в ближайшие 12 месяцев.

Менее распространенные языки программирования

У языков программирования, не входящих в топы рейтингов, очень сложно оценить потенциал. Количество поисковых запросов, как правило, плохо отражает реальность – из-за низких цифр в статистику вмешивается специфика региона и местных компаний. Из тех, на которые стоит обратить внимание гикам (а больше это, пожалуй, никому и не надо): Elixir, Dart и Ballerina.

Если о первых двух вы наверняка что-то слышали и читали, — а Dart даже многие успели похоронить — то о последнем стоит сказать чуть подробнее. Ballerina – это молодой и крайне интересный язык. Его синтаксис — комбинация из Java, Python, JavaScript и Go, со статической типизацией. Основные операции имеют привычный вид, поэтому на обучение не уйдёт много времени. Но куда интересней в Ballerina другое — направленность на интеграцию. В современном вебе, где постоянно взаимодействуют сотни серверов и сервисов, ценность языков с модулями, легко обеспечивающими это, крайне высока. Как альтернативу Ballerina можно взять на заметку Pulumi и Dark – будущее веба без языков инфраструктуры невозможно.

Однако, несмотря на все прелести и перспективы этих языков, браться за их изучение новичкам не следует – лишь представителей первого и отчасти второго разделов стоит рассматривать как фундамент современного программиста. Знание Elixir, Dart, Ballerina или Pulumi поможет понять, что у любой задачи есть множество решений.

Подробней об изучении разных языков программирования можно почитать на страницах факультетов Geekbrains — Python, Go, Java, а также веб-, iOS-, Android-разработки. Удачного выбора!

Пройти обучение

13 ноя 19, 12:36
0 0
Статистика 1
Показы: 1 Охват: 0 Прочтений: 0

Наставничество GeekBrains

Кто такие наставники

Чтобы ученики могли лучше прорабатывать материал и справляться со сложностями в обучении, мы придумали наставничество. Наставники помогают студентам GeekBrains осваивать программу, выполнять домашние задания и делать учебные проекты. 

Так выглядит раздел наставничества. Во вкладке «Обучение» описаны ключевые моменты — что это такое, как стать наставником и какая от этого польза

В GeekBrains можно стать наставником по программированию, маркетингу и дизайну. Помогать учащимся других потоков могут студенты, которые прошли курс, тестирование и сдали шесть из восьми домашних заданий на «хорошо» и «отлично».

Как стать наставником

Если вы выполнили эти условия, в разделе «Обучение» откроется страница «Наставничество». Внутри — вводная информация и списки доступных потоков. Выберите из них приглянувшийся и нажмите кнопку «Стать наставником». Вы увидите pop-up с описанием задания для потенциального наставника: записать короткое видео о том, почему вас интересует эта миссия и понравилось ли вам учиться в GeekBrains.

В доступных потоках перечислены курсы, к которым студент подходит по критериям: прошел курс, сдал шесть из восьми заданий на 4 и 5, успешно справился с тестом и прикрепил ролик

Простое задание для тех, кто хочет стать частью команды наставников GeekBrains

Наставниками смогут стать не все — претендентов рассматривает команда GeekBrains и выбирает тех, кто вписывается в комьюнити. Не волнуйтесь, что вашу заявку пропустят — их внимательно модерируют вручную, потому что наставники — это часть команды.

Когда заявка пройдет модерацию, вы официально станете наставником GeekBrains. Студенты будут обращаться к вам, когда преподаватель не отвечает на срочный вопрос, нужна помощь с домашним заданием или вопросом по теме, которую они не до конца понимают.

Недавно мы ввели систему оценок наставникам и отзывов о них

Почему быть наставником круто

Сейчас в GeekBrains 663 наставника, некоторые провели уже больше десяти потоков. Их профит в том, что благодаря вопросам от студентов они упражняются в сфере, которую недавно изучили, и прокачивают профессиональные навыки. Особо любознательные ученики задают сложные вопросы, на которые наставник не может ответить сразу — тогда они вместе разбираются и находят ответ. Так наставник углубляет свои знания и развивается как преподаватель — вникает в вопрос и учится понятно объяснять.

Что говорят сами наставники

Павел Пимкин, 43 года, Москва

«Я окончил курс «Frontend-разработчик». Стал наставником в феврале и провел уже 14 потоков. Эта практика помогает мне лучше изучить и закрепить тонкости языка, создать сеть людей, которые работают в IT. Но самое важное — когда помогаешь другим, чувствуешь себя нужным.

Бывали и необычные случаи. Я был наставником на курсах Java-1 и Java-2, и после их окончания одна из студенток попросила меня помогать ученикам на курсе по React. Я согласился, но в GeekBrains нет возможности стать наставником этого курса. Тогда я предложил студентке написать письмо в техподдержку с просьбой назначить меня. Через несколько дней это случилось — и было очень приятно, что я стал одним из немногих наставников на курсе React».

 

 

Артем Еремин, 29 лет, Москва

«Я учусь на факультете Java-разработки, был наставником на пяти потоках. Зачем мне это нужно? Приятно помогать людям, и полезно для меня — когда отвечаешь на вопросы студентов, глубже погружаешься в тему, которую уже проходил, освежаешь ее в памяти. Надеюсь, наставничество приносит пользу и студентам.

 

Фрагмент моего наставничества — помогаю студенту разобраться с домашним заданием

Больше всего студенты спрашивают по теме недели и домашним заданиям. Бывает, что вопросы прилетают рабочее время и немного отвлекают от дел. Иногда одновременно случается завал на работе и приходит куча сообщений от студентов. Все же начинают делать домашнее задание в последний момент, поэтому вопросы сыплются один за другим. Но все-таки это не мешает моим делам или работе».

Дмитрий Бронских, 22 года, Новоуральск

«Закончил две GeekBrains-профессии: «Программист PHP» и «Программист Android» — и сейчас учусь на факультете веб-разработки. Наставничество сразу заинтересовало. Ознакомился с описанием программы и решил, что будет интересно. Выполнил условия задания, стал наставником и сразу взялся курировать первый поток. На сегодняшний день я провел 24 потока. И уже заявился на несколько еще не стартовавших.

В наставничестве всегда присутствует элемент неожиданности. В любой момент может написать незнакомый человек и поставить задачу, от которой будешь в ступоре. Вот тут и начинается самое интересное — думаешь над ней, заново знакомишься с материалами урока и понимаешь, что другие преподаватели много нового привносят в учебную программу.

В итоге я сам лучше разбираюсь в материале, получаю новый опыт, нетипичный взгляд на решение задачи и благодарность от студентов — это всегда приятно. С некоторыми поддерживаем связь и вне обучения».

Валерий Туров, 28 лет, Балашиха

«Я окончил профессию «Программист Java» и после двух курсов устроился на работу по специальности. Наставником решил стать из «корыстных» целей — слышал, что человек, который объясняет тему, начинает сам лучше разбираться в ней. Было интересно углубить знания по Java, и наставничество рассматривал больше как пинок лично мне. Пинок, который поможет преодолеть лень, занятость и нехватку времени, чтобы узнать новое о языке и программировании.

Всегда приятно видеть, как у ребят, которым помогаешь, начинает получаться. Плюс я считаю, что тот, кто не только берет, но и умеет отдавать, кто может не только самообучаться, но и обучить других, становится счастливее. У такого человека в жизни больше получится.

Мне нравится помогать людям. Студент приходит со словами: «Слушай, у меня не получается, не могу понять» — и мы вместе разбираемся. Тогда я вижу, как у него появляется понимание темы. Для меня это заряд бодрости и уверенности в себе — нравится это чувство.

Вместе со студентами я сам лучше осваиваю предмет. Часто бывает, что человек спрашивает о чем-то элементарном. Объясняю, как меня учили, — не понимает. Начинаю по-другому и чувствую, что самому нужно больше данных. Лезу в исходный код в библиотеке, за дополнительной документацией, примерами — и начинаю лучше ориентироваться в теме, могу объяснить с другого ракурса.

На странице с отзывами обо мне как наставнике оставили комментарий о том, как я рассказываю о терминах программирования. Парень написал, что я захожу сильно издалека, но в итоге студент все понимает. Действительно: данные, переменные, функции оператора могу объяснить на тортах и автобусах. Студент первого курса ожидает услышать заумные определения, а ты говоришь: «Представь автобус, а в нем злого кондуктора». У человека подвисание происходит: «Мы сейчас точно о программировании говорим?»

«Осознал, что в объяснении терминов захожу издалека, только после этого отзыва»

Такой подход дает результат — студенты действительно понимают, если объяснять на аналогиях и нестандартных примерах. Неподготовленным людям, которые решили стать программистами, сложно оперировать абстрактными понятиями. Студенту проще, если сравнивать термины с тем, что он видит каждый день и может потрогать: со ступеньками лестницы, деревьями. Мы живем в физическом мире и привыкли видеть ручку, бумагу, клавиатуру, мышку.

Когда мы работаем с компьютером, на экране выводится результат действий. В программировании мы пишем код — инструкцию, которую выполняет компьютер. Как он это делает, как преобразует данные? Сложно сходу проделать путь от инструкции к действию вместе с машиной. Если я написал десять инструкций, то должен понимать, что компьютер выдаст в конце. Некоторым людям сложно мыслить такими абстракциями, поэтому примеры «на кошках» помогают.

Однажды я был наставником на курсе Java-2. Со студентами сложились приятельские отношения, но после курса общение в чате прекратилось. Чуть позже мне написал один из ребят: «Валера, ты был наставником у нас на курсе. Может еще побудешь?» Оказалось, они хотят сделать собственный проект — построить приложение под iOS и Android. Говорят: «После курса и стажировки начали делать, но не доделали, а забрасывать не хотим. Чувствуем, что нужна твердая рука. Ты уже работаешь программистом, давай с нами». Я согласился, начали вместе пилить приложение.

Потрясающее было время — для меня это был курс IT-менеджера, тимлидера, скрам-мастера и product owner-а в одном флаконе. Приложение не довели до конца, но остался его скелет на iOS и Android. Надеюсь, что знания у ребят не пропали даром, а исходный код сохранился — может быть, когда-то они закончат».

 

Пройти обучение

19 окт 18, 13:24
0 0
Статистика 1
Показы: 1 Охват: 0 Прочтений: 0
Показаны все темы: 4

Последние комментарии

нет комментариев
Читать

Поиск по блогу

Люди

7 пользователям нравится сайт lena2018.mirtesen.ru